package com.sdg.server.utils;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.sdg.server.service.Constant;
import org.bson.Document;

import java.util.ArrayList;

public class MongodbUtil {
    public static void main(String[] args) {
        //获取mongo的地址
        MongoClient mongoClient = getMongoClientNoCheck();

        MongoCollection<Document> movieRecsCollection = mongoClient.getDatabase(Constant.MONGODB_DATABASE).getCollection(Constant.MONGODB_MOVIE_RECS_COLLECTION);
        //从电影相似度度矩阵中，根据传过来的电影的id 去查出与之相似的电影
        //  Document movieRecs = movieRecsCollection.find().first();
        //1.数据类型，和表的名称
        //Document movieRecs = movieRecsCollection.find(Filters.eq("mid", 27783)).first();
        Document movieRecs = movieRecsCollection.find(new Document("mid", 27783)).first();

        // ArrayList<Document> recs = movieRecs.get("recs", ArrayList.class);
        ArrayList<Document> recs = movieRecs.get("recommendations", ArrayList.class);
        System.out.println(recs + "=========================");
       /* int size = mongoClient.getMaxBsonObjectSize();
        System.out.println("MaxBsonObjectSize >>>" + size);
        System.out.println("MongoDB 服务端地址：" + mongoClient.getAddress().toString());
        //进行简单的查询
        MongoIterable<String> listColls = mongoClient.getDatabase("recom3").listCollectionNames();
        for (String s : listColls) {
            System.out.println(s + "----------------");
        }*/
        //关闭客户端连接
        mongoClient.close();

    }

    private static MongoClient getMongoClientNoCheck() {
        //MongoClient 是线程安全的，可以在多个线程中共享同一个实例,
        // 一个 MongoClient 相当于一个客户端，一个客户端可以有多个连接
        MongoClient mongoClient = null;
        //new MongoClient 创建客户端的时候，可以传入 MongoClientOptions ,
        // 客户端配置选项所以可以将设置全部事先设置好
        MongoClientOptions.Builder build = new MongoClientOptions.Builder();
        //与目标数据库能够建立的最大连接数为50
        build.connectionsPerHost(50);
        //如果当前所有的连接都在使用中，则每个连接上可以有50个线程排队等待
        build.threadsAllowedToBlockForConnectionMultiplier(50);
        //一个线程访问数据库的时候，在成功获取到一个可用数据库连接之前的最长等待时间为
        //此处为 2分钟,如果超过 maxWaitTime 都没有获取到连接的话，该线程就会抛出 Exception
        build.maxWaitTime(1000 * 60 * 2);

        //设置与数据库建立连接时最长时间为1分钟
        build.connectTimeout(1000 * 60 * 1);
        MongoClientOptions mongoClientOptions = build.build();

        //将 MongoDB 服务器的 ip 与端口先封装好，连接 MongoDB 服务端地址，
        // 实际项目中应该放到配置文件进行配置
        ServerAddress serverAddress = new ServerAddress("vm2", 27017);
        //通过 ServerAddress 与 MongoClientOptions 创建连接到 MongoDB 的数据库实例，MongoClient(String host, int port)：
        //host：MongoDB 服务端 IP
        //port：MongoDB 服务端 端口，默认为 27017
        //即使 MongoDB 服务端关闭，此时也不会抛出异常，只有到真正调用方法是才会
        //连接 MongoDB 服务端地址，实际项目中应该放到配置文件进行配置
        mongoClient = new MongoClient(serverAddress, mongoClientOptions);
        return mongoClient;

    }
}
